package Java2Test.mythread.threadtest6;

import java.util.*;

public class MyRunnable implements Runnable {
    private final ArrayList<Integer> list; // 共享奖池，final确保引用不可变，多线程共享资源

    public MyRunnable(ArrayList<Integer> list) {
        this.list = list;
    }

    ArrayList<Integer> list1 = new ArrayList<>(); // 抽奖箱1的奖品列表
    ArrayList<Integer> list2 = new ArrayList<>(); // 抽奖箱2的奖品列表

    @Override
    public void run() {
        while (true) {
            // 核心难点1：同步锁保护共享资源访问
            // 使用类锁确保同一时刻只有一个线程操作奖池
            synchronized (MyRunnable.class) {
                // 核心难点2：原子性检查与操作
                // 先检查奖池是否为空，再执行后续逻辑，避免竞态条件
                if (list.isEmpty()) {
                    // 核心难点3：多线程结果统计与输出
                    if (Thread.currentThread().getName().equals("抽奖箱1")) {
                        // 潜在风险：若list1为空，Collections.max会抛异常（需提前判断）
                        int sum = 0;
                        for (int i = 0; i < list1.size(); i++) {
                            sum += list1.get(i);
                        }
                        System.out.println("在此次抽奖过程中,抽奖箱1" +
                                "总共产生了" + list1.size() +
                                "个奖项.分别为" + list1 +
                                ",最高奖项为" + Collections.max(list1) +
                                "元,总金额为" + sum + "元");
                    } else {
                        int sum = 0;
                        for (int i = 0; i < list2.size(); i++) {
                            sum += list2.get(i);
                        }
                        System.out.println("在此次抽奖过程中,抽奖箱2" +
                                "总共产生了" + list2.size() +
                                "个奖项.分别为" + list2 +
                                ",最高奖项为" + Collections.max(list2) +
                                "元,总金额为" + sum + "元");
                    }

                    break; // 奖池空时退出循环
                }
                // 核心难点4：随机抽取与奖品分配
                int randomIndex = new Random().nextInt(list.size());
                Integer prize = list.remove(randomIndex); // 抽取并移除奖品
                // 根据线程名称分配奖品到对应列表
                if (Thread.currentThread().getName().equals("抽奖箱1")) {
                    list1.add(prize);
                } else {
                    list2.add(prize);
                }
                // 核心难点5：线程调度与锁竞争控制
                // 同步块内休眠，延长锁持有时间，影响线程交替频率
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    Thread.currentThread().interrupt();
                }
            }
            // 同步块外逻辑：锁已释放，休眠不影响其他线程竞争
        }
    }
}